package com.njupt.towersystem.services.impl;

import com.google.common.hash.BloomFilter;
import com.njupt.towersystem.domain.managerinfos;
import com.njupt.towersystem.mapper.ManagerInfoMapper;
import com.njupt.towersystem.services.RegisterUserService;
import lombok.Synchronized;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.locks.ReentrantLock;

@Service
public class RegisteUserServiceImpl implements RegisterUserService {
    @Resource
    private ManagerInfoMapper managerInfoMapper;
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    @Resource
    private BloomFilter<String> nameFilter;


    private ReentrantLock lock= new ReentrantLock();
    private static Queue<Integer> userids=new PriorityQueue<>();

//    当springboot工程启动时候自动调用本方法对userids集合填充数据
    @PostConstruct
//    当程序启动时自动启动本方法一次
    private void addNewUseridTiArray(){
        int maxid=managerInfoMapper.findMaxUserid();
        for (int i=0;i<maxid+10000;i++){
            userids.add(i);
        }

    }
//程序启动 将所有的用户名和密码存放到bloom过滤器的bit数组中
    @PostConstruct
    private void addUserToBLoom(){
        List<String> names = managerInfoMapper.findAllName();
        for (String name:names){
            nameFilter.put(name);
        }
    }
    @Transactional
//    开启事务
    @Synchronized
//    上锁
    @Override
    public boolean regUser(managerinfos mi) {
//        到数据库检查用户名和密码是否存在 如果存在就 完蛋
//         通过布隆过滤器判断用户是否存在 存在就返回false
        boolean isHas = nameFilter.mightContain(mi.getLoginname());
        if (isHas){
            return false;
        }
        Integer maxid=0;
        lock.lock();
        try{
            if (userids.isEmpty()){
                addNewUseridTiArray();
            }
            maxid = userids.poll();

        }finally {
            lock.unlock();
        }
//        先查询最大的userid
//        int maxid=managerInfoMapper.findMaxUserid();
//        将最大值填充到对象中
        mi.setUserid(maxid);
//        将数据存放到数据库中
        managerInfoMapper.insertManagers(mi);
//        同时将该数据存放到redis数据库中
        stringRedisTemplate.opsForHash().put("manages",
                mi.getLoginname()+mi.getLoginpwd(),mi.toString());
//        将当前新建用户的用户名存放到bloom过滤器中
        nameFilter.put(mi.getLoginname());

        return true;
    }
}
